package gaej.example.contact.server;

import gaej.example.contact.client.Muziekstuk;
import gaej.example.contact.client.Bezetting;

import java.util.List;
import javax.jdo.PersistenceManager;
import gaej.example.contact.server.PmfSingleton;

public class MuziekstukDAOJdo implements MuziekstukDAO {

	public void addMuziekstuk(Muziekstuk muziekstuk) {
		PersistenceManager pm = PmfSingleton.get().getPersistenceManager();
		try {
			pm.makePersistent(muziekstuk);
		} finally {
			pm.close();
		}
	}

	@SuppressWarnings("unchecked")
	public List<Muziekstuk> listMuziekstukken() {
		PersistenceManager pm = PmfSingleton.get().getPersistenceManager();
		String query = "select from " + Muziekstuk.class.getName();
		return (List<Muziekstuk>) pm.newQuery(query).execute();
	}

	public List<Bezetting> listMuziekstukBezetting(Muziekstuk muziekstuk) {
		PersistenceManager pm = PmfSingleton.get().getPersistenceManager();
		muziekstuk = pm.getObjectById(Muziekstuk.class, muziekstuk.getMuziekstukNr());
		return (List<Bezetting>) muziekstuk.getBezetting();
	}

	public void removeMuziekstuk(Muziekstuk muziekstuk) {
		PersistenceManager pm =PmfSingleton.get().getPersistenceManager();
		try {
			pm.currentTransaction().begin();

			// We don't have a reference to the selected Object.
			// So we have to look it up first,
			muziekstuk = pm.getObjectById(Muziekstuk.class, muziekstuk.getMuziekstukNr());
			pm.deletePersistent(muziekstuk);

			pm.currentTransaction().commit();
		} catch (Exception ex) {
			pm.currentTransaction().rollback();
			throw new RuntimeException(ex);
		} finally {
			pm.close();
		}
	}

	public void updateMuziekstuk(Muziekstuk muziekstuk) {
		PersistenceManager pm = PmfSingleton.get().getPersistenceManager();
		
		try {
			// helaas is het niet gelukt om netjes muziekstukken met bezettingen
			// toe te voegen. Daarom is er gekozen voor een botte bijl methode:
			// - De oude verwijderen
			// - De nieuwe toevoegen
			
			// werkt niet... pm.currentTransaction().begin();
			
			// Verwijder de oude
			Muziekstuk muziekstukOld = pm.getObjectById(Muziekstuk.class, muziekstuk.getMuziekstukNr());
			pm.deletePersistent(muziekstukOld);

			// voeg de nieuwe toe
			pm.makePersistent(muziekstuk);
			// werkt niet... pm.currentTransaction().commit();
		} catch (Exception ex) {
			// werkt niet... pm.currentTransaction().rollback();
			throw new RuntimeException(ex);
		} finally {
			pm.close();
		}
	}

}
